#include<bits/stdc++.h>
using namespace std;
struct Node
{
    int t1,t2;
}p[3111];
int n,m,L,V;
int ans1=0,ans2=0;
int d[3111],v[3111],a[3111],s[3111],p2[3111];
vector<int> e[3111];
bool f[100111],fl[100111];
void dfs(int dep,int sum)
{
    if(sum+(m-dep+1)<=ans2) return;
    if(dep>m)
    {
        int cur=0;
        for(int i=1;i<=n;i++)
        {
            if(fl[i]==0) continue;
            for(int j=1;j<=m;j++)
            {
                if(p[j].t1>=d[i]&&f[j]==1)
                {
                    if(V*V<2*a[i]*(p[j].t1-d[i])+v[i]*v[i])
                    {
                        cur++;
                        break;
                    }
                }
            }
        }
        if(cur==ans1) ans2=max(ans2,sum);
    }
    else
    {
        f[dep]=1;
        dfs(dep+1,sum);
        f[dep]=0;
        dfs(dep+1,sum+1);
    }
}
bool check()
{
    for(int i=1;i<=n;i++)
        if(a[i]!=0) return false;
    return true;
}
bool cmp(Node kt1,Node kt2)
{
    if(kt1.t2!=kt2.t2) return kt1.t2>kt2.t2;
    else return kt1.t1>kt2.t1;
}
bool check2(int k)
{
    for(int i=1;i<=k;i++)
        p2[i]=p[i].t1;
    int cur=0;
    for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=k;j++)
            {
                if(p2[j]>=d[i])
                {
                    if(V*V<2*a[i]*(p2[j]-d[i])+v[i]*v[i])
                    {
                        cur++;
                        break;
                    }
                }
            }
        }
    if(cur==ans1) return true;
    else return false;
}
void work()
{
    memset(fl,0,sizeof(fl));
    ans1=0,ans2=0;
    cin>>n>>m>>L>>V;
    for(int i=1;i<=n;i++)
        cin>>d[i]>>v[i]>>a[i];
    for(int i=1;i<=m;i++)
        cin>>p[i].t1;
    if(n<=20&&m<=20)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(p[j].t1>=d[i])
                {
                    if(V*V<2*a[i]*(p[j].t1-d[i])+v[i]*v[i])
                    {
                        ans1++;
                        fl[i]=1;
                        break;
                    }
                }
            }
        }
        cout<<ans1<<" ";
        dfs(1,0);
        cout<<ans2<<"\n";
    }
    else if(check())
    {
        for(int i=1;i<=n;i++)
        {
            int j=m;
            if(p[j].t1>=d[i])
            {
                if(V*V<2*a[i]*(p[j].t1-d[i])+v[i]*v[i])
                {
                    ans1++;
                    break;
                }
            }
        }
        cout<<ans1<<' '<<m-1<<'\n';
    }
    else if(n<=3000&&m<=3000)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(p[j].t1>=d[i])
                {
                    if(V*V<2*a[i]*(p[j].t1-d[i])+v[i]*v[i])
                    {
                        ans1++;
                        break;
                    }
                }
            }
        }
        cout<<ans1<<" ";
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(p[j].t1>=d[i])
                {
                    if(V*V<2*a[i]*(p[j].t1-d[i])+v[i]*v[i])
                    {
                        e[i].push_back(j);
                        p[j].t2++;
                    }
                }
            }
        }
        sort(p+1,p+m+1,cmp);
        int l=0,r=m;
        while(l+1<r)
        {
            int mid=(l+r)>>1;
            if(check2(mid)) r=mid;
            else l=mid;
        }
        cout<<r<<"\n";
    }
}
int main()
{
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    int T;
    cin>>T;
    while(T--) work();
    return 0;
}